package main

import (
	"fmt"
	"sync"
	"time"
)

var wg sync.WaitGroup

//向 intchan 放入 1-120000个数

//从 intchan取出数据，并判断是否为素数，如果是，就把得到的素数放在primeChan

//printPrime打印素数的方法

func putNum(intChan chan int) {
	for i := 2; i < 1000000; i++ {
		intChan <- i
	}
	close(intChan)
	wg.Done()
}

func primeNum(intChan chan int, primeChan chan int, exitChan chan bool) {
	for num := range intChan {
		var flag = true
		for i := 2; i < num; i++ {
			if num%i == 0 {
				flag = false
				break
			}
		}
		if flag {
			primeChan <- num
		}
	}
	//要 关闭primeChan  ？？
	// close(primeChan)
	exitChan <- true
	wg.Done()
}

// 打印素数的方法
func printPrime(primeChan chan int) {
	// for v := range primeChan {
	// 	fmt.Println(v)
	// }
	wg.Done()
}

func main() {
	intChan := make(chan int, 10000)    //存放数字的管道
	primeChan := make(chan int, 150000) //存放素数的管道
	exitChan := make(chan bool, 16)     //标识管道完成的管道
	var startTime = time.Now().Unix()
	wg.Add(1)
	go putNum(intChan)

	for i := 0; i < 16; i++ {
		wg.Add(1)
		go primeNum(intChan, primeChan, exitChan)
	}
	wg.Add(1)
	go printPrime(primeChan)

	//判断exitChan是否存满值
	wg.Add(1)
	go func() {
		for i := 0; i < 16; i++ {
			<-exitChan
		}
		//关闭 primeChan
		close(primeChan)
		wg.Done()
	}()
	wg.Wait()
	var endTime = time.Now().Unix()
	fmt.Println("执行完毕。。。", endTime-startTime)
}
